#include <stdio.h>

//int main()
//{
//    // 完全初始化
//    int arr1[5] = {1, 2, 3, 4, 5};
//
//    // 部分初始化, 未指定的按照默认值进行初始化
//    // int/float -> 0
//    // char      -> '\0'
//    // 指针数组   -> NULL
//    int arr2[5] = {0};
//
//    for(int i=0; i<5; i++) {
//        printf("arr1[%d] -> %d\n", i, arr1[i]);
//        printf("arr2[%d] -> %d\n", i, arr2[i]);
//    }
//    return 0;
//}


// C99变长数组
// 在 C99 标准中引入的变长数组（Variable-Length Array，简称 VLA） 是一种特殊的数组，其长度可以在运行时确定，而不必在编译时就固定。
//int main()
//{
//    int n = 0;
//    scanf("%d", &n);
//    int arr[n];
//    printf("sizeof(arr) = %ld", sizeof(arr) / sizeof(int));
//    
//    return 0;
//}


// 取地址，拿出的是变量的首地址，最小的地址
//int main()
//{
//    int num = 10;
//    char *tmp = (char*)&num;
//    for(int i=0; i<4; i++) {
//        printf("%p\n", tmp+i);
//    }
//    return 0;
//}


// 指针变量的大小
//int main()
//{
//    printf("%ld\n", sizeof(void*));
//    printf("%ld\n", sizeof(char*));
//    printf("%ld\n", sizeof(int*));
//    printf("%ld\n", sizeof(float*));
//    printf("%ld\n", sizeof(double*));
//    printf("%ld\n", sizeof(long long*));
//    return 0;
//}


//int main()
//{
//    int a[] = {1,2,3,4};
//    printf("%d\n",sizeof(a));    // 16
//    printf("%d\n",sizeof(a+0));  // 4/8
//    printf("%d\n",sizeof(*a));   // 4
//    printf("%d\n",sizeof(a+1));  // 4/8
//    printf("%d\n",sizeof(a[1])); // 4
//    printf("%d\n",sizeof(&a));   // 4/8
//    printf("%d\n",sizeof(*&a));
//    printf("%d\n",sizeof(&a+1));
//    printf("%d\n",sizeof(&a[0]));
//    printf("%d\n",sizeof(&a[0]+1));
//    return 0;
//}


//int main()
//{
//    char arr[] = {'a','b','c','d','e','f'};
//    printf("%d\n", sizeof(arr));
//    printf("%d\n", sizeof(arr+0));
//    printf("%d\n", sizeof(*arr));
//    printf("%d\n", sizeof(arr[1]));
//    printf("%d\n", sizeof(&arr));
//    printf("%d\n", sizeof(&arr+1));
//    printf("%d\n", sizeof(&arr[0]+1));
//    
//    return 0;
//}


//int main()
//{
//    char arr[] = "abcdef";
//    printf("%d\n", strlen(arr));
//    printf("%d\n", strlen(arr+0));
//    printf("%d\n", strlen(*arr));
//    printf("%d\n", strlen(arr[1]));
//    printf("%d\n", strlen(&arr));
//    printf("%d\n", strlen(&arr+1));
//    printf("%d\n", strlen(&arr[0]+1));
//    return 0;
//}


//int main()
//{
//    char *p = "abcdef";
//    printf("%d\n", strlen(p));
//    printf("%d\n", strlen(p+1));
//    printf("%d\n", strlen(*p));
//    printf("%d\n", strlen(p[0]));
//    printf("%d\n", strlen(&p));
//    printf("%d\n", strlen(&p+1));
//    printf("%d\n", strlen(&p[0]+1));
//    return ;
//}

//#include <stdio.h>
//int main()
//{
// int a[5] = { 1, 2, 3, 4, 5 };
// int *ptr = (int *)(&a + 1);
// printf( "%d,%d", *(a + 1), *(ptr - 1));
// return 0;
//}

//假设环境是x86环境，程序输出的结果是啥？ 
//#include <stdio.h>
//int main()
//{
//    int a[5][5];
//    int k = 0;
//    for(int i=0; i<5; i++) {
//       for(int j=0; j<5; j++) {
//        a[i][j] = k++;
//       } 
//    }
//    int(*p)[4];
//    p = a;
//    printf("%d\n", p[4][2]);
//    printf("%d\n", a[4][2]);
//    printf( "%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
//    return 0;
//}


#include <stdio.h>
int main()
{
 char *c[] = {"ENTER","NEW","POINT","FIRST"};
 char**cp[] = {c+3,c+2,c+1,c};
 char***cpp = cp;
 printf("%s\n", **++cpp);
 printf("%s\n", *--*++cpp+3);
 printf("%s\n", *cpp[-2]+3);
 printf("%s\n", cpp[-1][-1]+1);
 return 0;
}
